package com.cf.base.http.core;

import com.cf.base.http.bean.ErrorResponse;
import com.cf.base.http.generator.BaseBodyErrorAdapter;
import com.cf.base.http.interceptor.headers.HeaderProvider;

import okhttp3.OkHttpClient;
import retrofit2.CallAdapter;
import retrofit2.Converter;

/**
 * @author yangji
 * 创建链式构建 网络框架 避免漏掉关键信息
 */
public interface IHttpBuilder {

    interface ICfHttpModuleName {
        /**
         * 设置模块名称 不能为空
         *
         * @param moduleName 模块名称
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfHttpUrl moduleName(String moduleName);
    }

    interface ICfHttpUrl {
        /**
         * 设置BaseUrl
         *
         * @param url BaseUrl
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfClient baseUrl(String url);
    }

    interface ICfClient {
        /**
         * 设置builder
         *
         * @param builder builder
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfHeader client(OkHttpClient.Builder builder);
    }

    interface ICfHeader {
        /**
         * 配置头信息
         *
         * @param provider 配置头信息
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfRetrofitFactory header(HeaderProvider provider);
    }

    interface ICfRetrofitFactory {
        /**
         * 配置解析器
         *
         * @param converterFactory 配置解析器
         * @param callFactory      配置解析器
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfErrorAdapter retrofitFactory(Converter.Factory converterFactory, CallAdapter.Factory callFactory);
    }

    interface ICfErrorAdapter {
        /**
         * 配置错误处理器
         *
         * @param adapter 配置错误处理器
         * @return 为了防止 使用者漏掉初始化信息
         */
        ICfBuilder errorAdapter(BaseBodyErrorAdapter<? extends ErrorResponse> adapter);
    }

    interface ICfBuilder extends ICfHttpModuleName, ICfHttpUrl, ICfClient, ICfRetrofitFactory, ICfErrorAdapter, ICfHeader {
        /**
         * 创建 Retrofit 请求
         *
         * @return RetrofitService
         */
        RetrofitService build();
    }

}
